# -*- coding: utf-8 -*-
#===============================================================================
# Koro Business Environment
# Copyright (C) 2008  Antonio Corroppoli
#
#This file is part of Koro BE.
# 
# Koro BE is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# Koro BE is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with Koro BE; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#===============================================================================

'''
Created on 12/ago/2011

@author: antstud
'''

from decimal import Decimal
from sqlalchemy.orm import object_session,reconstructor
from koro import util
from koro.core.model import IDObject,PersistentObject
from koro.core import exception


#===============================================================================
# Commerciale
#===============================================================================
class Commerciale(object):
    def __init__(self):
        self.fk_listino=None
        self.listino=None
        self.fk_iva=None
        self.iva=None
        self.fk_pagamento=None
        self.pagamento=None
        self.sconti=''
    
    def get_listino_fmt(self):
        if self.fk_listino is None:
            return ''
        return self.listino.nome
    
    def set_listino(self,listino):
        if listino is not None:
            self.fk_listino=listino.ID
        else:
            self.fk_listino=None
        self.listino=listino 

    def get_pagamento(self):
        return self.pagamento

    def get_listino(self):
        return self.listino

    def get_iva(self):
        return self.iva

    def set_pagamento(self, value):
        self.pagamento = value

    def set_iva(self, iva):
        if iva is not None:
            self.fk_iva=iva.codice
        else:
            self.fk_iva=None
        self.iva=iva
    
    def set_sconti(self,value):
        #TODO:controllarese il formato e' giusto
        self.sconti=value


#===============================================================================
# Iva
#===============================================================================
class Iva(PersistentObject):
    def __init__(self):
        PersistentObject.__init__(self)
        self.codice=''
        self.aliquota=Decimal(0)
        self.descrizione=''
        self.note=''
    
    def validate(self):
        if self.codice is None or not util.to_bool(self.codice.lstrip()):
            raise exception.KoroInvalidObject("Il campo 'Codice' è richiesto")

    def get_codice(self):
        return self.codice

    def get_percentuale(self):
        return self.aliquota

    def get_descrizione(self):
        return self.descrizione
    
    def get_imposta(self, importo):
        return importo / 100 * self.aliquota

    def set_codice(self, value):
        self.codice = value

    def set_percentuale(self, value):
        self.aliquota = Decimal(value)

    def set_descrizione(self, value):
        self.descrizione = value


#===============================================================================
# Listino
#===============================================================================
class Listino(IDObject):
    
    PREZZO_FORNITORE=1
    
    def __init__(self):
        IDObject.__init__(self)
        #self.codice=None#deve scomparire
        self.nome=''
        self.descrizione=''
        self.listino_fornitore=False
        self.fk_listino_formula=None
        self.listino_formula=None
        self.ricarico_formula=Decimal('0.00')
        self.importo_fisso_formula=Decimal('0.00')
    
    def __eq__(self,listino):
        return self.ID==listino.ID
    
    @reconstructor
    def on_load(self):
        self.listino_formula=object_session(self).query(Listino).filter_by(ID=self.fk_listino_formula).first()
        self.ricarico_formula=util.to_decimal(self.ricarico_formula)
        self.importo_fisso_formula=util.to_decimal(self.importo_fisso_formula)
    
    def validate(self):
        if not bool(self.nome.lstrip()):
            raise exception.KoroInvalidObject("Il campo 'Nome' è richiesto")
    
    def is_listino_fornitore(self):
        return self.listino_fornitore

    def has_formula(self):
        return bool(self.fk_listino_formula)
    
    def set_listino_formula(self,listino_formula):
        self.listino_formula=listino_formula
        if listino_formula is None:
            self.fk_listino_formula=None
        else:
            self.fk_listino_formula=listino_formula.ID
    
    def set_formula(self,listino_formula,ricarico,fisso):
        self.set_listino_formula(listino_formula)
        self.ricarico_formula=Decimal(ricarico)
        self.importo_fisso_formula=Decimal(fisso)
    
    def get_formula_fmt(self):
        if not self.has_formula():
            return ''
        template="[{0}]".format(self.listino_formula.nome)
        if not self.ricarico_formula.is_zero():
            template+="+{0}%".format(self.ricarico_formula)
        if not self.importo_fisso_formula.is_zero():
            template+="+{0}€".format(util.euro(self.importo_fisso_formula))
        return template


#autoconfigurazione tipi listino
#Listino.configure()


#===============================================================================
# Spese
#===============================================================================
class Spese(IDObject):#non credo venga mai usata
    def __init__(self):
        IDObject.__init__(self)
        self.iva=None
        self.descizione=''
        self.importo=Decimal('0.00')
    
    def validate(self):
        return True


#===============================================================================
# Pagamento NON SVILUPPATO! TODO:fare da zero
#===============================================================================
class Pagamento(object):
    def __init__(self):
        self.codice=None
        self.descrizione=""

    def get_codice(self):
        return self.codice

    def get_descrizione(self):
        return self.descrizione

    def set_codice(self, value):
        self.codice = value

    def set_descrizione(self, value):
        self.descrizione = value